/*
*********************************************************************************************************
*
*	模块名称 : 串口驱动模块
*	文件名称 : bsp_usart.c
*	版    本 : v1.0.00
*	说    明 : 
*
*********************************************************************************************************
*/

#include "bsp.h"

/* 串口1的GPIO --- PA9(TXD) PA10(RXD) */

/*
*********************************************************************************************************
*	函 数 名: InitHardUart
*	功能说明: 配置串口的GPIO及中断
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
static void InitHardUart(void)
{
    GPIO_InitType GPIO_InitStructure;

    /* Enable GPIO clock */
    RCC_AHBPeriphClockCmd(RCC_AHBPERIPH_GPIOA, ENABLE);

    /* Enable USART1 Clock */
    RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_USART1, ENABLE);
    /* Connect PXx to USART1_Tx */
    GPIO_PinAFConfig(GPIOA, GPIO_PinsSource9, GPIO_AF_1);
    /* Connect PXx to USART1_Rx */
    GPIO_PinAFConfig(GPIOA, GPIO_PinsSource10, GPIO_AF_1);
    /* Configure USART1 Tx/Rx */
    GPIO_InitStructure.GPIO_Pins = GPIO_Pins_9 | GPIO_Pins_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;
    GPIO_InitStructure.GPIO_OutType = GPIO_OutType_PP;
    GPIO_InitStructure.GPIO_Pull = GPIO_Pull_NOPULL;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

/*
*********************************************************************************************************
*	函 数 名: SetBaudrate
*	功能说明: 配置串口波特率
*	形    参: USARTx.串口 Value.波特率
*	返 回 值: 无
*********************************************************************************************************
*/
static void SetBaudrate(USART_Type *USARTx, uint32_t Value)
{
    USART_InitType USART_InitStructure;

    /*
        - BaudRate = Value
        - Word Length = 8 Bits
        - One Stop Bit
        - No parity
        - Hardware flow control disabled (RTS and CTS signals)
        - Receive and transmit enabled
  */
    USART_InitStructure.USART_BaudRate = Value;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    /* Configure USARTx */
    USART_Init(USARTx, &USART_InitStructure);
    /* Enable USARTx */
    USART_Cmd(USARTx, ENABLE);
}

/*
*********************************************************************************************************
*	函 数 名: bsp_InitUsart
*	功能说明: 串口初始化
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
void bsp_InitUsart(void)
{
    InitHardUart();
    SetBaudrate(USART1, UART1_BAUD);
}

/*
*********************************************************************************************************
*	函 数 名: my_fputc
*	功能说明: 重定义putc函数，可以使用printf函数从串口1打印输出
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
void my_fputc(unsigned char ch)
{
    /* 写一个字节到USART1 */
    USART1->DT = (ch & (uint16_t)0x01FF);
    /* 等待发送结束 */
    while (USART_GetFlagStatus(USART1, USART_FLAG_TRAC) == RESET)
    {
    }
}

/*
*********************************************************************************************************
*	函 数 名: fgetc
*	功能说明: 重定义getc函数，可以使用getchar函数从串口1输入数据
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
unsigned char my_fgetc(void)
{
    /* 等待接收到数据 */
    while (USART_GetFlagStatus(USART1, USART_FLAG_RDNE) == RESET)
    {
    }

    return (unsigned char)(USART1->DT & (uint16_t)0x01FF);
}

int fputc(int ch, FILE *f)
{
    /* 写一个字节到USART1 */
    USART1->DT = (ch & (uint16_t)0x01FF);
    /* 等待发送结束 */
    while (USART_GetFlagStatus(USART1, USART_FLAG_TRAC) == RESET)
    {
    }

    return ch;
}

int fgetc(FILE *f)
{
    /* 等待接收到数据 */
    while (USART_GetFlagStatus(USART1, USART_FLAG_RDNE) == RESET)
    {
    }

    return (int)(USART1->DT & (uint16_t)0x01FF);
}
/********************************************* End of file **********************************************/
